home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Atari Compendium
/
The Atari Compendium (Toad Computers) (1994).iso
/
files
/
umich
/
tex
/
td187src.lzh
/
TEXTBOX.I
< prev
next >
Wrap
Text File
|
1991-12-14
|
51KB
|
1,628 lines
IMPLEMENTATION MODULE TextBox ;
FROM SYSTEM IMPORT ADDRESS , ADR;
FROM Storage IMPORT ALLOCATE , DEALLOCATE ;
FROM OwnBoxes IMPORT MousePos, WaitForDepress;
IMPORT CommonData ;
IMPORT Diverses;
IMPORT Fill;
IMPORT HelpModule ;
IMPORT MagicAES ;
IMPORT MagicBIOS ;
IMPORT MagicStrings;
IMPORT MagicSys;
IMPORT MagicVDI ;
IMPORT MathLib0;
IMPORT mtAppl ;
IMPORT Types;
IMPORT Undo;
IMPORT Variablen ;
IMPORT VectorFont;
(**
IMPORT RTD;
**)
CONST UseXBIOS = FALSE;
TYPE XYArray = ARRAY [0..3] OF INTEGER;
VAR AlignMode : INTEGER;
Internal : BOOLEAN;
VectorFontMode : BOOLEAN;
storesize : LONGREAL;
storeslant : LONGREAL;
storeangle : INTEGER;
PROCEDURE SetVectorText(On : BOOLEAN);
(*
Schaltet auf Vektor-Zeichensatz um;
standardmäßig jedoch ausgeschaltet.
*)
BEGIN
VectorFontMode := On;
IF VectorFontMode THEN
VectorFontMode := VectorFont.FontsLoaded()>0;
END;
END SetVectorText;
PROCEDURE RoundedRect(pxy : ARRAY OF INTEGER);
VAR maxradius : INTEGER;
min : INTEGER;
radius : INTEGER;
MinX, MinY : INTEGER;
distx, disty : INTEGER;
line : ARRAY [0..3] OF INTEGER;
BEGIN
maxradius := Variablen.MaxCircle();
maxradius := Variablen.PicDistance(maxradius);
MinX := Diverses.min(pxy[0], pxy[2]);
MinY := Diverses.min(pxy[1], pxy[3]);
min := Diverses.min(ABS(pxy[2] - pxy[0]), ABS(pxy[3] - pxy[1]));
radius := Variablen.PicDistance(min DIV 2);
IF radius>maxradius THEN radius := maxradius; END;
IF min>0 THEN
distx := ABS(pxy[2] - pxy[0]) - 2*radius;
disty := ABS(pxy[3] - pxy[1]) - 2*radius;
(* Zeichne die 4 Eckkreise *)
(* Links oben *)
MagicVDI.Arc (mtAppl.VDIHandle , MinX + radius, MinY + radius,
radius , 900 , 1800) ;
(* Links unten *)
MagicVDI.Arc (mtAppl.VDIHandle , MinX + radius, MinY + radius + disty,
radius , 1800 , 2700) ;
(* Rechts unten *)
MagicVDI.Arc (mtAppl.VDIHandle , MinX + radius + distx, MinY + radius + disty,
radius , 2700 , 3600) ;
(* Rechts oben *)
MagicVDI.Arc (mtAppl.VDIHandle , MinX + radius + distx, MinY + radius,
radius , 0 , 900) ;
(* Und dann die Zwischenlinien *)
IF distx>0 THEN
line[0] := MinX + radius; line[1] := pxy[1];
line[2] := MinX + radius + distx; line[3] := pxy[1];
MagicVDI.Polyline (mtAppl.VDIHandle , 2 , line) ;
line[1] := pxy[3];
line[3] := pxy[3];
MagicVDI.Polyline (mtAppl.VDIHandle , 2 , line) ;
END;
IF disty>0 THEN
line[0] := pxy[0];
line[1] := MinY + radius;
line[2] := pxy[0];
line[3] := MinY + radius + disty;
MagicVDI.Polyline (mtAppl.VDIHandle , 2 , line) ;
line[0] := pxy[2];
line[2] := pxy[2];
MagicVDI.Polyline (mtAppl.VDIHandle , 2 , line) ;
END;
END;
END RoundedRect;
PROCEDURE FillBox(x1, y1, x2, y2 : INTEGER);
VAR pxy : XYArray;
i : INTEGER;
BEGIN
IF x1<x2 THEN
pxy[0] := x1; pxy[2] := x2;
ELSE
pxy[0] := x2; pxy[2] := x1;
END;
IF y1<y2 THEN
pxy[1] := y1; pxy[3] := y2;
ELSE
pxy[1] := y2; pxy[3] := y1;
END;
IF (x1<>x2) AND (y1<>y2) THEN
(**
FOR i:=0 TO 3 DO
RTD.ShowVar('pxy', pxy[i]);
END;
**)
MagicVDI.SetClipping (mtAppl.VDIHandle , CommonData.ClipXY , TRUE) ;
MagicVDI.FillRectangle(mtAppl.VDIHandle, pxy);
MagicVDI.SetClipping (mtAppl.VDIHandle , CommonData.ClipXY , FALSE) ;
END;
END FillBox;
PROCEDURE MakeBox (Style, FillMode : INTEGER ;
VAR XY : XYArray) : BOOLEAN ;
VAR
dum, x, y,
xo, yo, i,
picx, picy : INTEGER ;
xy , xyo : ARRAY [ 0..9 ] OF INTEGER ;
PxyArray : XYArray;
result : BOOLEAN;
delete : BOOLEAN;
lbut, rbut : BOOLEAN;
(* Style = -1 => RoundedBox *)
(* Style = -2 => FrameBox (wobei Box später gelöscht wird) *)
BEGIN
(**
RTD.Into('MakeBox');
**)
WaitForDepress(x, y);
(**
RTD.Message('Buttons released');
**)
MagicVDI.SetLineEndstyles (mtAppl.VDIHandle , MagicVDI.Cornerd , MagicVDI.Cornerd) ;
(**
RTD.Message('EndStyle ready');
**)
IF Style=-2 THEN
Style := 1;
delete := TRUE;
ELSE
delete := FALSE;
END;
IF Style <> -1 THEN
dum := MagicVDI.SetLinetype (mtAppl.VDIHandle , Style) ;
ELSE
dum := MagicVDI.SetLinetype (mtAppl.VDIHandle , MagicVDI.Line) ;
END;
(**
RTD.Message('Linetype ready');
**)
IF (Style=1) AND delete THEN
dum := MagicVDI.SetLinewidth (mtAppl.VDIHandle , 1);
ELSE
dum := MagicVDI.SetLinewidth (mtAppl.VDIHandle ,
CommonData.LineWidth) ;
END;
(**
RTD.Message('Linewidth ready');
**)
dum := MagicVDI.SetLinecolor (mtAppl.VDIHandle , MagicAES.BLACK) ;
(**
RTD.Message('Linecolor ready');
**)
FOR i := 0 TO 4 DO
xy [ 2*i ] := x ;
xyo [ 2*i ] := x ;
xy [ 2*i + 1 ] := y ;
xyo [ 2*i + 1 ] := y ;
END ;
xo := x ; yo:=y ;
(**
RTD.Message('Entering repeat...');
**)
REPEAT
MousePos(x, y, picx, picy, lbut, rbut);
Variablen.Position (TRUE, x, y, xy[0], xy[1]) ;
IF (x <> xo) OR (y <> yo) THEN
IF Style<>-1 THEN
xy [ 2 ] := x ; xy [ 4 ] := x ;
xy [ 5 ] := y ; xy [ 7 ] := y ;
ELSE
xy [ 2 ] := x; xy [ 3 ] := y;
END;
(**
RTD.Message('Init. start');
**)
dum := MagicVDI.SetWritemode (mtAppl.VDIHandle , MagicVDI.XOR) ;
MagicVDI.SetClipping (mtAppl.VDIHandle , CommonData.ClipXY , TRUE) ;
Diverses.MouseOff;
(**
RTD.Message('Init. end');
**)
IF Style<>-1 THEN
dum := MagicVDI.SetWritemode (mtAppl.VDIHandle , MagicVDI.XOR) ;
MagicVDI.Polyline (mtAppl.VDIHandle , 5 , xyo) ;
MagicVDI.Polyline (mtAppl.VDIHandle , 5 , xy) ;
IF (FillMode>=0) THEN
Fill.SetFillMode(FillMode);
(**
RTD.Message('Set Clip');
**)
MagicVDI.SetClipping (mtAppl.VDIHandle , CommonData.ClipXY , TRUE) ;
(**
RTD.Message('Set WriteMode');
**)
dum := MagicVDI.SetWritemode (mtAppl.VDIHandle , MagicVDI.XOR) ;
FillBox(xyo[0], xyo[1], xyo[4], xyo[5]);
FillBox(xy[0], xy[1], xy[4], xy[5]);
(*
MagicVDI.FilledArea(mtAppl.VDIHandle , 5, xyo);
MagicVDI.FilledArea(mtAppl.VDIHandle , 5, xy);
*)
Fill.SetFillMode(-1);
END;
ELSE
FOR i := 0 TO 3 DO
PxyArray[i] := xyo[i];
END;
RoundedRect (PxyArray);
FOR i := 0 TO 3 DO
PxyArray[i] := xy[i];
END;
RoundedRect (PxyArray);
END;
Diverses.MouseOn;
MagicVDI.SetClipping (mtAppl.VDIHandle , CommonData.ClipXY , FALSE) ;
dum := MagicVDI.SetWritemode (mtAppl.VDIHandle , MagicVDI.REPLACE) ;
IF Style<> -1 THEN
xyo [ 2 ] := x ; xyo [ 4 ] := x ;
xyo [ 5 ] := y ; xyo [ 7 ] := y ;
ELSE
xyo [ 2 ] := x ; xyo [ 3 ] := y ;
END;
xo := x ; yo := y ;
END ;
UNTIL lbut OR rbut;
dum := MagicVDI.SetWritemode (mtAppl.VDIHandle , MagicVDI.XOR) ;
MagicVDI.SetClipping (mtAppl.VDIHandle , CommonData.ClipXY , TRUE) ;
Diverses.MouseOff;
IF Style<>-1 THEN
IF (FillMode>=0) THEN
Fill.SetFillMode(FillMode);
dum := MagicVDI.SetWritemode (mtAppl.VDIHandle , MagicVDI.XOR) ;
FillBox(xy[0], xy[1], xy[4], xy[5]);
Fill.SetFillMode(-1);
END;
MagicVDI.Polyline (mtAppl.VDIHandle , 5 , xy) ;
ELSE
FOR i := 0 TO 3 DO
PxyArray[i] := xy[i];
END;
RoundedRect (PxyArray);
END;
Diverses.MouseOn;
MagicVDI.SetClipping (mtAppl.VDIHandle , CommonData.ClipXY , FALSE) ;
dum := MagicVDI.SetWritemode (mtAppl.VDIHandle , MagicVDI.REPLACE) ;
IF lbut AND NOT rbut THEN
IF NOT delete THEN
dum := MagicVDI.SetWritemode (mtAppl.VDIHandle , MagicVDI.REPLACE) ;
MagicVDI.SetClipping (mtAppl.VDIHand